package me.flyray.bsin.infrastructure.biz.paychannel.joinpay.domain.response;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;

/**
 * 汇聚支付 API - 订单查询响应实体类
 * <p>
 * 用于封装解析汇聚支付订单查询接口返回的 JSON 数据。
 *
 * @author Gemini
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OrderResponse {

    /**
     * 版本号
     * <ul>
     * <li><b>说明:</b> 当前版本号为 2.5</li>
     * <li><b>必填:</b> 是</li>
     * <li><b>长度:</b> D(3,1)</li>
     * </ul>
     */
    @JsonProperty("r0_Version")
    private String version;

    /**
     * 商户编号
     * <ul>
     * <li><b>说明:</b> 商户在支付平台的唯一身份标识。</li>
     * <li><b>必填:</b> 是</li>
     * <li><b>长度:</b> X(15)</li>
     * </ul>
     */
    @JsonProperty("r1_MerchantNo")
    private String merchantNo;

    /**
     * 商户订单号
     * <ul>
     * <li><b>说明:</b> 商户系统提交的唯一订单号。</li>
     * <li><b>必填:</b> 是</li>
     * <li><b>长度:</b> X(50)</li>
     * </ul>
     */
    @JsonProperty("r2_OrderNo")
    private String orderNo;

    /**
     * 支付金额
     * <ul>
     * <li><b>说明:</b> 单位元，精确到分，保留两位小数。</li>
     * <li><b>必填:</b> 否</li>
     * <li><b>长度:</b> D(16,2)</li>
     * </ul>
     */
    @JsonProperty("r3_Amount")
    private BigDecimal amount;

    /**
     * 商品名称
     * <ul>
     * <li><b>说明:</b> 用于支付时显示在支付平台网关上的订单产品信息。</li>
     * <li><b>必填:</b> 否</li>
     * <li><b>长度:</b> X(10)</li>
     * </ul>
     */
    @JsonProperty("r4_ProductName")
    private String productName;

    /**
     * 交易流水号
     * <ul>
     * <li><b>说明:</b> 支付平台生成的流水号。</li>
     * <li><b>必填:</b> 否</li>
     * <li><b>长度:</b> X(60)</li>
     * </ul>
     */
    @JsonProperty("r5_TrxNo")
    private String trxNo;

    /**
     * 银行流水号
     * <ul>
     * <li><b>说明:</b> 银行返回的流水号。支付成功后才返回。</li>
     * <li><b>必填:</b> 否</li>
     * <li><b>长度:</b> X(30)</li>
     * </ul>
     */
    @JsonProperty("r6_BankTrxNo")
    private String bankTrxNo;

    /**
     * 订单手续费
     * <ul>
     * <li><b>说明:</b> 单位元，精确到分，保留两位小数。</li>
     * <li><b>必填:</b> 是</li>
     * <li><b>长度:</b> D(16,2)</li>
     * </ul>
     */
    @JsonProperty("r7_Fee")
    private String fee;

    /**
     * 交易类型
     * <ul>
     * <li><b>说明:</b> 详见附录 7.3 交易类型列表。</li>
     * <li><b>必填:</b> 否</li>
     * <li><b>长度:</b> X(50)</li>
     * </ul>
     */
    @JsonProperty("r8_FrpCode")
    private String frpCode;

    /**
     * 订单状态
     * <ul>
     * <li><b>说明:</b> 100:成功, 101:失败, 102:已创建, 105:订单已关闭。</li>
     * <li><b>必填:</b> 否</li>
     * <li><b>长度:</b> X(20)</li>
     * </ul>
     */
    @JsonProperty("ra_Status")
    private String status;

    /**
     * 响应码
     * <ul>
     * <li><b>说明:</b> 参见 7.1 响应码。</li>
     * <li><b>必填:</b> 是</li>
     * <li><b>长度:</b> X(20)</li>
     * </ul>
     */
    @JsonProperty("rb_Code")
    private String code;

    /**
     * 响应码描述
     * <ul>
     * <li><b>说明:</b> 参见 7.1 响应码。</li>
     * <li><b>必填:</b> 是</li>
     * <li><b>长度:</b> X(10)</li>
     * </ul>
     */
    @JsonProperty("rc_CodeMsg")
    private String codeMsg;

    /**
     * 用户标识
     * <ul>
     * <li><b>说明:</b> 用户在商户 appid 下的唯一标识。</li>
     * <li><b>必填:</b> 否</li>
     * <li><b>长度:</b> X(128)</li>
     * </ul>
     */
    @JsonProperty("rd_OpenId")
    private String openId;

    /**
     * 平台优惠金额
     * <ul>
     * <li><b>说明:</b> 单位元，精确到分，保留两位小数。</li>
     * <li><b>必填:</b> 否</li>
     * <li><b>长度:</b> D(16,2)</li>
     * </ul>
     */
    @JsonProperty("re_DiscountAmount")
    private BigDecimal discountAmount;

    /**
     * 支付时间
     * <ul>
     * <li><b>说明:</b> 格式: yyyy-MM-dd HH:mm:ss (24小时制)。</li>
     * <li><b>必填:</b> 否</li>
     * <li><b>长度:</b> X(20)</li>
     * </ul>
     */
    @JsonProperty("rf_PayTime")
    private String payTime;

    /**
     * 卡类型
     * <ul>
     * <li><b>说明:</b> 参见附录 7.5。</li>
     * <li><b>必填:</b> 否</li>
     * <li><b>长度:</b> X(2)</li>
     * </ul>
     */
    @JsonProperty("rh_cardType")
    private String cardType;

    /**
     * 银行编码
     * <ul>
     * <li><b>说明:</b> 枚举值见附录《银行类型对照表》。</li>
     * <li><b>必填:</b> 是</li>
     * <li><b>长度:</b> X(10)</li>
     * </ul>
     */
    @JsonProperty("ri_BankCode")
    private String bankCode;

    /**
     * 签约 ID
     * <ul>
     * <li><b>说明:</b> 使用银联云微信小程序签约成功有值。</li>
     * <li><b>必填:</b> 否</li>
     * <li><b>长度:</b> X(32)</li>
     * </ul>
     */
    @JsonProperty("rl_ContractId")
    private String contractId;

    /**
     * 签名数据
     * <ul>
     * <li><b>说明:</b> 参见5签名机制。</li>
     * <li><b>必填:</b> 是</li>
     * <li><b>长度:</b> X(4000)</li>
     * </ul>
     */
    @JsonProperty("hmac")
    private String hmac;
}
